// pkg/core/app.go
package core

import (
	"net/http"
	"star-go-app/internal/apps"
	"star-go-app/pkg/middleware"
	"time"

	"github.com/gin-gonic/gin"
)

type Application struct {
	engine  *gin.Engine
	server  *http.Server
	modules []apps.Module
}

func (app *Application) RegisterModule(module apps.Module) {
	app.modules = append(app.modules, module)
}

// RegisterAndInitializeModules 注册并初始化所有模块 (对外提供的便捷方法)
func (app *Application) RegisterAndInitializeModules() {
	// 这个方法会被router.registry调用来完成模块注册
	// 然后调用InitializeModules来完成初始化
	app.InitializeModules()
}

// InitializeModules initializes all registered modules
func (app *Application) InitializeModules() {
	// 设置全局路由和中间件
	app.setupGlobalRoutes()

	// 创建API v1路由组
	apiV1 := app.engine.Group("/api")

	// 注册所有模块路由
	for _, module := range app.modules {
		// 每个模块在api下创建自己的路由组
		moduleGroup := apiV1.Group("/" + module.Name())
		module.RegisterRoutes(moduleGroup)

		// 初始化模块
		if err := module.Initialize(); err != nil {
			panic("模块初始化失败: " + module.Name() + ", 错误: " + err.Error())
		}
	}
}

// setupGlobalRoutes 设置全局路由和中间件
func (app *Application) setupGlobalRoutes() {
	// 添加全局中间件
	app.engine.Use(middleware.Logger())   // 请求日志中间件
	app.engine.Use(middleware.Recovery()) // 异常恢复中间件
	app.engine.Use(middleware.Cors())     // CORS跨域中间件

	// 添加全局限流中间件 - 每分钟180个请求
	app.engine.Use(middleware.RateLimit(180, time.Minute))

	// 添加全局认证中间件（根据配置自动启用/禁用和排除路由）
	app.engine.Use(middleware.GlobalAuth())

	// 健康检查路由
	app.engine.GET("/health", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"status":  "ok",
			"message": "服务运行正常",
		})
	})

	// 根路径信息
	app.engine.GET("/", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "欢迎使用Star-Go-App API",
			"version": "v1.0.0",
			"docs":    "/api/docs",
		})
	})
}
